Irc: module
{
	PATH: con "/acme/dis/irc.dis";
	MAXARG : con 16;

	#IRC response codes 
	RPL_WELCOME : con 001;
	RPL_YOURHOST : con 002;
	RPL_CREATED : con 003;
	RPL_MYINFO : con 004;
	RPL_BOUNCE : con 005;
	RPL_USERHOST : con 302;
	RPL_ISON : con 303;
	RPL_AWAY : con 301;
	RPL_UNAWAY : con 305;
	RPL_NOWAWAY : con 306;
	RPL_WHOISUSER : con 311;
	RPL_WHOISSERVER : con 312;
	RPL_WHOISOPERATOR : con 313;
	RPL_WHOISIDLE : con 317;
	RPL_ENDOFWHOIS : con 318;
	RPL_WHOISCHANNELS : con 319;
	RPL_WHOISIDENTIFIED : con 320;
	RPL_WHOWASUSER : con 314;
	RPL_ENDOFWHOWAS : con 369;
	RPL_LISTSTART : con 321;
	RPL_LIST : con 322;
	RPL_LISTEND : con 323;
	RPL_UNIQOPIS : con 325;
	RPL_CHANNELMODEIS : con 324;
	RPL_NOTOPIC : con 331;
	RPL_TOPIC : con 332;
	RPL_OWNERTIME : con 333;
	RPL_INVITING : con 341;
	RPL_SUMMONING : con 342;
	RPL_INVITELIST : con 346;
	RPL_ENDOFINVITELIST : con 347;
	RPL_EXCEPTLIST : con 348;
	RPL_ENDOFEXCEPTLIST : con 349;
	RPL_VERSION : con 351;
	RPL_WHOREPLY : con 352;
	RPL_ENDOFWHO : con 315;
	RPL_NAMREPLY : con 353;
	RPL_ENDOFNAMES : con 366;
	RPL_LINKS : con 364;
	RPL_ENDOFLINKS : con 365;
	RPL_BANLIST : con 367;
	RPL_ENDOFBANLIST : con 368;
	RPL_INFO : con 371;
	RPL_ENDOFINFO : con 374;
	RPL_MOTDSTART : con 375;
	RPL_MOTD : con 372;
	RPL_ENDOFMOTD : con 376;
	RPL_YOUREOPER : con 381;
	RPL_REHASHING : con 382;
	RPL_YOURESERVICE : con 383;
	RPL_TIME : con 391;
	RPL_USERSSTART : con 392;
	RPL_USERS : con 393;
	RPL_ENDOFUSERS : con 394;
	RPL_NOUSERS : con 395;
	RPL_TRACELINK : con 200;
	RPL_TRACECONNECTING : con 201;
	RPL_TRACEHANDSHAKE : con 202;
	RPL_TRACEUNKNOWN : con 203;
	RPL_TRACEOPERATOR : con 204;
	RPL_TRACEUSER : con 205;
	RPL_TRACESERVER : con 206;
	RPL_TRACESERVICE : con 207;
	RPL_TRACENEWTYPE : con 208;
	RPL_TRACECLASS : con 209;
	RPL_TRACERECONNECT : con 210;
	RPL_TRACELOG : con 261;
	RPL_TRACEEND : con 262;
	RPL_STATSLINKINFO : con 211;
	RPL_STATSCOMMANDS : con 212;
	RPL_ENDOFSTATS : con 219;
	RPL_STATSUPTIME : con 242;
	RPL_STATSOLINE : con 243;
	RPL_UMODEIS : con 221;
	RPL_SERVLIST : con 234;
	RPL_SERVLISTEND : con 235;
	RPL_LUSERCLIENT : con 251;
	RPL_LUSEROP : con 252;
	RPL_LUSERUNKNOWN : con 253;
	RPL_LUSERCHANNELS : con 254;
	RPL_LUSERME : con 255;
	RPL_ADMINME : con 256;
	RPL_ADMINLOC1 : con 257;
	RPL_ADMINLOC2 : con 258;
	RPL_ADMINEMAIL : con 259;
	RPL_TRYAGAIN : con 263;
	ERR_NOSUCHNICK : con 401;
	ERR_NOSUCHSERVER : con 402;
	ERR_NOSUCHCHANNEL : con 403;
	ERR_CANNOTSENDTOCHAN : con 404;
	ERR_TOOMANYCHANNELS : con 405;
	ERR_WASNOSUCHNICK : con 406;
	ERR_TOOMANYTARGETS : con 407;
	ERR_NOSUCHSERVICE : con 408;
	ERR_NOORIGIN : con 409;
	ERR_NORECIPIENT : con 411;
	ERR_NOTEXTTOSEND : con 412;
	ERR_NOTOPLEVEL : con 413;
	ERR_WILDTOPLEVEL : con 414;
	ERR_BADMASK : con 415;
	ERR_UNKNOWNCOMMAND : con 421;
	ERR_NOMOTD : con 422;
	ERR_NOADMININFO : con 423;
	ERR_FILEERROR : con 424;
	ERR_NONICKNAMEGIVEN : con 431;
	ERR_ERRONEUSNICKNAME : con 432;
	ERR_NICKNAMEINUSE : con 433;
	ERR_NICKCOLLISION : con 436;
	ERR_UNAVAILRESOURCE : con 437;
	ERR_USERNOTINCHANNEL : con 441;
	ERR_NOTONCHANNEL : con 442;
	ERR_USERONCHANNEL : con 443;
	ERR_NOLOGIN : con 444;
	ERR_SUMMONDISABLED : con 445;
	ERR_USERSDISABLED : con 446;
	ERR_NOTREGISTERED : con 451;
	ERR_NEEDMOREPARAMS : con 461;
	ERR_ALREADYREGISTRED : con 462;
	ERR_NOPERMFORHOST : con 463;
	ERR_PASSWDMISMATCH : con 464;
	ERR_YOUREBANNEDCREEP : con 465;
	ERR_YOUWILLBEBANNED : con 466;
	ERR_KEYSET : con 467;
	ERR_CHANNELISFULL : con 471;
	ERR_UNKNOWNMODE : con 472;
	ERR_INVITEONLYCHAN : con 473;
	ERR_BANNEDFROMCHAN : con 474;
	ERR_BADCHANNELKEY : con 475;
	ERR_BADCHANMASK : con 476;
	ERR_NOCHANMODES : con 477;
	ERR_BANLISTFULL : con 478;
	ERR_NOPRIVILEGES : con 481;
	ERR_CHANOPRIVSNEEDED : con 482;
	ERR_CANTKILLSERVER : con 483;
	ERR_RESTRICTED : con 484;
	ERR_UNIQOPPRIVSNEEDED : con 485;
	ERR_NOOPERHOST : con 491;
	ERR_UMODEUNKNOWNFLAG : con 501;
	ERR_USERSDONTMATCH : con 502;

	readchan: chan of ref Imsg;
	writechan: chan of string;
	subchan: chan of ref Isub;
	unsubchan: chan of ref Isub;
	nick: string;
	chatty: int;

	Imsg : adt {
		prefix: string;
		src: string;
		dst: string;
		cmd: string;
		cmdnum: int;
		arg: list of string;
	};

	Isub : adt {
#		aux :  ref Ichan;
		mop: int;
		snoop: int;
		match: ref fn(i: ref Isub, m: ref Imsg): int;
		ml: chan of ref Imsg;
		disable: int;
		name: string;
	};

	Iwho : adt {
		user: string;
		host: string;
		server: string;
		nick: string;
		mode: string;
		hops: int;
		fullname: string;
	};

	Ichan : adt {
		refn: int;
		sure: int;
		name: string;
		sub: ref Isub;
		topic: string;
		owner: string;
		time: int;
		who: list of ref Iwho;
		err: string;
		_inwho: int;
		chatter: chan of ref Imsg;
	};

	init: fn();
	ircdial: fn(addr: string): int;
	login: fn(fullname: string, nicks: list of string, passwd: string): int;
	ircjoin: fn(name: string, sure: int): (string, ref Ichan);
	ircleave: fn(ic: ref Ichan);
	irccistrcmp: fn(s, t: string): int;
	addwho: fn(ic: ref Ichan, m: ref Imsg);
	findnick: fn(ic: ref Ichan, name: string): ref Iwho;
	addname: fn(ic: ref Ichan, name: string);
	delname: fn(ic: ref Ichan, name: string);
	changename: fn(ic: ref Ichan, old, name: string);
	irctolower: fn(c: int): int;
	inputrelay: fn(ic: ref Ichan);
	imsgfmt: fn(m: ref Imsg): string;
};
